package com.cn.wanxi.service.impl;

import com.cn.wanxi.dao.CompanyDao;
import com.cn.wanxi.model.CompanyModel;
import com.cn.wanxi.service.CompanyService;
import com.cn.wanxi.util.IOTool;
import com.cn.wanxi.util.Path;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 服务逻辑层
 * 1.需要数据  dao
 * 2.需要文件：有文件（创建文件）
 * 3.文件里面的内容是什么？dao层的内容：将dao层的内容写入到文件里面
 * 4.需要返回的companyModel对象是文件里面读取的数据，进行封装
 * ----------------------------------------------
 * java api Java的帮助文档：前期建议看中文(推荐看英文)
 * File 文件或者文件目录的抽象表示
 * Field  属性
 * Method  方法
 */
public class CompanyServiceImpl implements CompanyService {

    /**
     * 一个方法里面只能做一件事情，如果有其他事情就应该对它进行封装：将它分开
     * 做五件事情，应该是行为，所以应该未不同的方法
     *
     * @return
     */
    @Override
    public CompanyModel getCompanyModel() {


//        1.创建文件
        File file = IOTool.createFile(Path.PATH, Path.FILE_NAME_COMPANY);
//        2.写入数据
        List<String> data = setDaoData();
        IOTool.writeFile(file, data);
//        3.读取数据
        String string = IOTool.readCharFile(file);
//        4.封装数据
//        5.返回数据
        return setData(string);
    }

    /**
     * 将dao层的数据全部封装到数组里面，供io流工具类进行写入文件
     * 如果我们不知道数组的长度，或者数组很长，下面封装数据的时候感觉非常困难
     * 有没有更好的容器，不用判断当前的数据类型是什么？
     * 也不用判断当前数组到底要多少个，
     * 直接可以进行赋值的容器？
     * 它叫做集合List
     *
     * @return
     */
    private List<String> setDaoData() {
//        String[] data = {CompanyDao.LOGO, CompanyDao.PHONE, CompanyDao.PHONE, CompanyDao.PHONE, CompanyDao.PHONE, CompanyDao.PHONE, CompanyDao.PHONE, CompanyDao.PHONE, CompanyDao.PHONE, CompanyDao.PHONE, CompanyDao.PHONE, CompanyDao.PHONE};
//        String[] data = new String[6];
//        data[0] = CompanyDao.LOGO;
//        data[0] = CompanyDao.LOGO;
//        data[0] = CompanyDao.LOGO;
//        data[0] = CompanyDao.LOGO;
//        data[0] = CompanyDao.LOGO;
//        data[0] = CompanyDao.LOGO;
//        return data;
//        数组是array
//        集合是list，可变数组
//        List一般情况下会需要指定数据类型？，如果不指定数据类型则为Object
//        List里面数据类型可不可以为int？不能为基本数据类型
//        看见类后面是<>的代表泛型
//         List<int> list = new ArrayList<>();
        List<String> list = new ArrayList<>();
//        list.add(1);
//        list.add(true);
//        list.add(new CompanyModel());
        list.add(CompanyDao.LOGO);
        list.add(CompanyDao.PHONE);
        list.add(CompanyDao.ADDRESS);
        list.add(CompanyDao.EMAIL);
        list.add(CompanyDao.NET);
        list.add(CompanyDao.VERSION);
        list.add(CompanyDao.LINE_PHONE);
        return list;
    }


    /**
     * 根据读取的数据封装成CompanyModel
     *
     * @param string
     */
    private CompanyModel setData(String string) {
        CompanyModel companyModel = new CompanyModel();
//   能不能将读取出来的数据分开？字符串怎么分开？分开过后用什么容器来装？
//        直接将StringBuilder转换为数组，没有直接方法？
//        所以就要考虑将StringBuilder转换为其他数组类型，然后再转换为数组
        String[] results = string.split("\r\n");
        companyModel.setLogo(results[0]);
        companyModel.setPhone(results[1]);
        companyModel.setNet(results[4]);
        companyModel.setEmail(results[3]);
        companyModel.setLinePhone(results[6]);
        companyModel.setVersion(results[5]);
        companyModel.setAddress(results[2]);
        return companyModel;
    }

    /**
     * 字节流读取
     *
     * @param file
     */
    private void readFile(File file) {
        try {
            InputStream inputStream = new FileInputStream(file);
//            怎么将ascii嘛转换为字符？
//            怎么将整型转换为字符？
//            第二阶段类型转换：
//            char aa = ' ';
//            char[] bb=new char[10];
            int read = 0;
            StringBuilder result = new StringBuilder();
//            字符怎么拼接成字符串？
//            String 和StringBuilder和StringBuffer的区别？
            while ((read = inputStream.read()) != -1) {
//                aa = (char) read;
                result.append((char) read);
            }
            System.out.print(result);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


}
